/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import clases.EstadoSeccion;
import clases.Rol;
import clases.Seccion;
import clases.Usuario;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Rafa
 */
public class DAO_Seccion {

    Session sesion = null;

    public DAO_Seccion() {
        this.sesion = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public List<Seccion> consultaSecciones(boolean iniciar) {
        List<Seccion> listaSecciones = new ArrayList();
        try {
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();
            if (iniciar) {
                sesion.beginTransaction();
            }

            //Se realiza la consulta
            Query q = sesion.createQuery("from Seccion where nombre <> '" + Constantes.getNO_SECCION() + "'");

            //Se recoge el resultado de la consulta
            listaSecciones = (List<Seccion>) q.list();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return listaSecciones;
    }

    public Seccion consultaSeccion(String nombre, boolean iniciar) {
        Seccion seccion = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();
            //Se hace la consulta
            Query query = sesion.createQuery("from Seccion where nombre = '" + nombre + "'");
        //query.setParameter("nombre", nombre);

            //Se recoge el resultado de la consulta
            seccion = (Seccion) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return seccion;
    }

    public Seccion consultaSeccionPorId(Integer id, boolean iniciar) {
        Seccion seccion = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();
            //Se hace la consulta
            Query query = sesion.createQuery("from Seccion where idSeccion = '" + id + "'");

            //Se recoge el resultado de la consulta
            seccion = (Seccion) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return seccion;
    }

    public Seccion insertaSeccion(String nombre, String descripcion, int numMaxArticulos, Set<Usuario> usuarios, boolean iniciar) {

        DAO_EstadoSeccion daoEstadoSeccion = new DAO_EstadoSeccion();
        EstadoSeccion estado = daoEstadoSeccion.consultaEstadoSeccion(Constantes.getSECCION_ACTIVADA(), true);

        Seccion seccion = null;
        if (usuarios != null) {
            try {
                if (iniciar) {
                    sesion.beginTransaction();
                }
                //sesion.getSessionFactory().getCurrentSession().beginTransaction();

                seccion = new Seccion(estado, nombre, descripcion, numMaxArticulos);
                seccion.setUsuarios(usuarios);

                //No se tiene que comenzar una transaccion ya que esta comenzada en la consulta
                sesion.save(seccion);

                /*Se guardan los roles de cada usuario*/
                Usuario[] users = usuarios.toArray(new Usuario[]{});
                for (int j = 0; j < users.length; j++) {
                    /*Se coge el conjunto de roles del usuario y luego se pasa a un array*/
                    Set<Rol> rolDeUser = users[j].getRols();
                    Rol[] roles = rolDeUser.toArray(new Rol[]{});

                    /*Por cada usuario se añade una fila en SeccionUsuarioRol*/
                    for (int k = 0; k < roles.length; k++) {
                        try {                
                            /*Se crea este objeto para opder insertar la relacion entre usuario, seccion y rol*/
                            DAO_SeccionUsuarioRol daoResult = new DAO_SeccionUsuarioRol();
                            
                            //org.hibernate.Transaction txx = sesion.beginTransaction();
                            daoResult.insertaSeccionUsuarioRol(seccion, users[j], roles[k], true);
                        } catch (Exception e) {
                            if (sesion.getTransaction() != null) {
                                sesion.getTransaction().rollback();
                            }
                            e.printStackTrace();

                        }
                    }
                }
                sesion.getTransaction().commit();
            } catch (Exception e) {
                if (sesion.getTransaction() != null) {
                    sesion.getTransaction().rollback();
                }
                e.printStackTrace();

            }
        }
        return seccion;
    }

    public boolean eliminaSeccion(Integer idSeccion, boolean iniciar) {
        boolean correcto = false;
        try {

            Seccion sec = null;
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();
            if (iniciar) {
                sesion.beginTransaction();
                sec = consultaSeccionPorId(idSeccion, false);
            } else {
                sec = consultaSeccionPorId(idSeccion, true);
            }

            sesion.delete(sec);
            sesion.getTransaction().commit();
            correcto = true;
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();
        }
        return correcto;
    }

    public boolean modificaSeccion(String descripcion, String nombre, String estadoSeccion, Integer numMaxArt, Integer idSeccion, Set<Usuario> usuarios, boolean iniciar) {

        boolean correcto = false;
        DAO_EstadoSeccion daoEstado = new DAO_EstadoSeccion();
        EstadoSeccion estUpt = daoEstado.consultaEstadoSeccion(estadoSeccion, true);

        Seccion seccion;
        //sesion.getSessionFactory().getCurrentSession().beginTransaction();
        if (iniciar) {
            sesion.beginTransaction();
            seccion = consultaSeccionPorId(idSeccion, false);
        } else {
            seccion = consultaSeccionPorId(idSeccion, true);
        }

        Set<Usuario> oldUsuarios = seccion.getUsuarios();
        DAO_SeccionUsuarioRol daoSUR = new DAO_SeccionUsuarioRol();
        daoSUR.modificaSeccionUsuarioRol(seccion, oldUsuarios, usuarios, true);

        try {
            seccion.setNombre(nombre);
            seccion.setDescripcion(descripcion);
            seccion.setNumMaxArticulos(numMaxArt);
            seccion.setEstadoSeccion(estUpt);
            seccion.setUsuarios(usuarios);

            sesion.saveOrUpdate(seccion);
            sesion.getTransaction().commit();
            correcto = true;
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();

        }

        return correcto;
    }

    public boolean modificaEstadoSeccion(Integer idSeccion, boolean iniciar) {

        boolean correcto = false;
        DAO_EstadoSeccion daoEstado = new DAO_EstadoSeccion();
        EstadoSeccion estUpt = new EstadoSeccion();

        Seccion sec = null;
        //sesion.getSessionFactory().getCurrentSession().beginTransaction();
        if (iniciar) {
            sesion.beginTransaction();
            sec = consultaSeccionPorId(idSeccion, false);
        } else {
            sec = consultaSeccionPorId(idSeccion, true);
        }

        String estadoSeccion;
        if (sec.getEstadoSeccion().getEstado().equals("on")) {
            estadoSeccion = "off";
            estUpt = daoEstado.consultaEstadoSeccion(estadoSeccion, true);
        } else if (sec.getEstadoSeccion().getEstado().equals("off")) {
            estadoSeccion = "on";
            estUpt = daoEstado.consultaEstadoSeccion(estadoSeccion, true);
        }

        if (sec != null) {
            sec.setEstadoSeccion(estUpt);

            try {

                sesion.saveOrUpdate(sec);
                sesion.getTransaction().commit();
                correcto = true;
            } catch (Exception e) {
                if (sesion.getTransaction() != null) {
                    sesion.getTransaction().rollback();
                }
                e.printStackTrace();

            }
        }

        return correcto;
    }
}
